﻿package igz.fleaxy.ui.text {
	
	import flash.text.TextFieldAutoSize;
	import igz.fleaxy.util.ObjectUtil;
	
	/**
	 * @author Intelygenz | www.intelygenz.com
	 */
	public class LabelUi extends TextUi {
		
		private var _FullText : String;
		
		protected var _HiddenText : Boolean;

		protected var _Settings : Object;
		
		/**
		 * Etiqueta de texto a la que se le puede establecer un ancho fijo y un número
		 * de líneas a mostrar.
		 * 
		 * @param	p_htmlText Texto HTML
		 * @param	p_style Nombre de clase de la CSS
		 * @param	p_settings { css: Fleaxy.$Current.$CssManager.$Default
		 * 						, maxLines: null
		 * 						, fixWidth: null
		 * 						}
		 * 
		 * @example
		 * 
		 * Crea un label con texto en multiidioma:
		 * 	
		 * var lblTexto:LabelUi = new LabelUi( LocaleManager.$GetText("TEST","EJEMPLO")
		 * 							   , "classNameTexto"
		 * 							   , { maxLines: 1, fixWidth: 200 }
		 * 							  );
		 * addChild(lblTexto);
		 * 
		 * lblTexto.$SetMaxLines(2);
		 * 
		 * lblTexto.$SetFixWidth(500);
		 * 
		 */
		public function LabelUi(p_htmlText:String = "", p_style:String = "", p_settings:Object = null) {
			_Settings = { "fixWidth" : null
						, "maxLines" : null
				        }
			ObjectUtil.$Merge( p_settings, _Settings );
			
			this.selectable   = false;
			this.mouseEnabled = false;
			this.multiline    = true;
			this.autoSize     = TextFieldAutoSize.LEFT;
			
			if ( _Settings["fixWidth"] != null ) {
				_SetFixWidth();
			}
			
			_FullText = p_htmlText;
			
			super(p_htmlText, p_style, p_settings);
		}
		
		private function _SetFixWidth():void {
			this.autoSize	= TextFieldAutoSize.NONE;
			this.width		= _Settings["fixWidth"];
			this.wordWrap	= true;
		}
		
		private function _SetFullText ( p_htmlText:String ) : void {
			_FullText = p_htmlText;
			_RefreshHtmlText();
		}
		
		private function _RefreshHtmlText():void {
			super.htmlText = _FullText;

			//Si la longitud del texto supera el tamaño del Label se recorta y se activa el flag _HiddenText
			if (  _Settings["maxLines"] != null && this.numLines > _Settings["maxLines"] ) {
				_CutLabelText();
				_HiddenText = true;
			}
			else {
				_HiddenText = false;
			}
		}

		private function _CutLabelText():void {

			var lblTemp:TextUi = new TextUi("", super._StyleName);
			lblTemp.multiline    = true;
			lblTemp.autoSize     = TextFieldAutoSize.LEFT;
			if ( _Settings.fixWidth != null ) {
				lblTemp.autoSize	= TextFieldAutoSize.NONE;
				lblTemp.width = _Settings["fixWidth"];
				lblTemp.wordWrap = true;
			}
			lblTemp.htmlText = _FullText + "...";
			
			var car:String;
			var tagHtml:Boolean = false;
			var pos:int = lblTemp.htmlText.length - 4;
			while ( lblTemp.numLines > _Settings["maxLines"] && pos >= 0) {
				car = lblTemp.htmlText.charAt(pos);
				if ( car == ">" ) {
					tagHtml = true;
				}
				else if ( car == "<" ) {
					tagHtml = false;
					if ( lblTemp.htmlText.substring(pos, pos + 6).toUpperCase() == "<BR />" ) {
						// Eliminar salto linea
						lblTemp.htmlText = lblTemp.htmlText.substring(0, pos) 
										 + lblTemp.htmlText.substring(pos + 6, lblTemp.htmlText.length)
										 ;
					}
				}
				else if ( !tagHtml) {
					// Eliminar caracter
					lblTemp.htmlText = lblTemp.htmlText.substring(0, pos)
									 + lblTemp.htmlText.substring(pos + 1, lblTemp.htmlText.length)
									 ;
				}
				pos--;
			}

			super.htmlText = lblTemp.htmlText;
		}
		
		override public function get htmlText() : String {
			return _FullText;
		}
		
		override public function set htmlText(p_htmlText:String) : void {
			_SetFullText(p_htmlText);
		}
		
		override public function get text() : String {
			return _FullText;
		}
		
		override public function set text(p_text:String) : void {
			_SetFullText(p_text);
		}
		
		/**
		 * Establece el ancho máximo que puede tener el label. Si una linea supera este límite
		 * se añade un salto de línea, por lo tanto, crece en altura que se puede limitar también
		 * con maxLines.
		 * 
		 * @param	p_fixWidth Ancho máximo deseado en píxeles
		 */
		public function $SetFixWidth( p_fixWidth:uint ):void {
			_Settings["fixWidth"] = p_fixWidth;
			_SetFixWidth();
			_RefreshHtmlText();
		}
		
		/**
		 * Establece el número máximo de líneas que pueden ser mostradas.
		 * En caso de superarlo se añaden "..." al final del texto.
		 * 
		 * @param	p_maxLines Número de lineas a mostrar
		 */
		public function $SetMaxLines( p_maxLines:uint ):void {
			_Settings["maxLines"] = p_maxLines;
			_RefreshHtmlText();
		}
		
		/**
		 * Indica si se esta ocultando texto al sobrepasar el ancho fijo y el número máximo de lineas especificados
		 */
		public function get $HiddenText () : Boolean {
			return _HiddenText;
		}

	}
}